package com.huangyi;

public class Main {
    public static void main(String[] args) {
        // 测试用例
    }

    // 买卖股票的最佳时机含冷冻期
    static class Solution {
        public int maxProfit(int[] prices) {
            // 1) 边界处理
            if (prices == null || prices.length == 0) return 0;

            int n = prices.length;
            // dp[i][j] 表示第 i 天结束时的状态：
            // j=0: 持有股票
            // j=1: 不持有股票（非冷冻期）
            // j=2: 不持有股票（冷冻期，刚卖出）
            int[][] dp = new int[n + 1][3];

            // 2) 初始状态：第 0 天（未开始）
            final int NEG = Integer.MIN_VALUE / 2; // 避免溢出
            dp[0][0] = NEG; // 不可能持有股票
            dp[0][1] = 0;   // 空仓，利润为 0
            dp[0][2] = NEG; // 不可能刚卖出

            // 3) 状态转移
            for (int i = 1; i <= n; i++) {
                // 持有股票：昨天持有 或 昨天空仓今天买入
                dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i - 1]);
                // 空仓（非冷冻）：昨天空仓 或 昨天冷冻期结束
                dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][2]);
                // 冷冻期：昨天持有今天卖出
                dp[i][2] = dp[i - 1][0] + prices[i - 1];
            }

            // 4) 返回最后一天不持有股票的最大利润
            return Math.max(dp[n][1], dp[n][2]);
        }
    }
}